@tool
@icon("res://addons/下拉菜单01/icon01.svg")
extends Control
##这是林巧致制作的下拉菜单节点，是一种菜单UI的表现形式，该节点随意使用
class_name 下拉菜单01
##展开或收起?
@export var 开关菜单:bool=false:
	set(a):
		if 开关菜单!=a:
			if a==true:
				菜单切换("展开")
			if a==false:
				菜单切换("收起")
			开关菜单=a
##该属性决定图标和菜单展开收起时的动画速度,单位为秒
@export var 展开动画速度:float=0.5
@export_enum("快慢", "慢快", "慢快慢","快慢快") var 展开动画缓动: String="快慢"
@export_enum("线性", "正弦", "5次方","4次方","3次方","2次方","平方根","弹球","弹跳","回放","弹簧") var 展开动画过渡: String="线性"
@export var 收起动画速度:float=0.5
@export_enum("快慢", "慢快", "慢快慢","快慢快") var 收起动画缓动: String="快慢"
@export_enum("线性", "正弦", "5次方","4次方","3次方","2次方","平方根","弹球","弹跳","回放","弹簧") var 收起动画过渡: String="线性"
@export_group("图标设置")
##该项决定图标是否显示,默认开启
@export var 图标显示:bool=true:
	set(a):
		小图标aa.visible=a
		图标显示=a
@export var 图标大小:float=1:
	set(a):
		小图标aa.scale=Vector2(a,a)
		图标大小=a
##该项决定图标是否启用tween旋转动画,默认开启
@export var 图标动画:bool=true

##图标横轴位置限制在-1~2,自由拖动设置或代码设置
@export_range(-1, 2) var 图标横轴位置:float=0.9:
	set(a):
		图标横轴位置=a
		控件更新()
##图标横轴位置限制在-1~2,自由拖动设置或代码设置
@export_range(-1, 2) var 图标竖轴位置:float=0.5:
	set(a):
		图标竖轴位置=a
		控件更新()
@export_file("svg") var 小图标文件路径="res://addons/下拉菜单01/图标_01.svg"
@export_group("选项设置")
##此项为选项数量以及名称,点击添加元素可新建子级菜单,请直接填写子级菜单按钮的名称
@export var 选项:Array[String]=[""]:
	set(a):
		选项=a
		创建选项按钮()
@export var 选项间距:float=0
@export var 样式预设=preload("res://addons/下拉菜单01/预设.tres")
var 选项实例:Array
var 小图标aa:TextureRect
var 显示文字:Button
var sizee:Vector2:
	set(a):
		sizee=a
		控件更新()
var tween字典:Dictionary
var 鼠标在里面:bool=false
##该信号传递一个数组,[0]为下拉菜单自身,[1]为子选项按钮(该按钮的name由下拉菜单里的选项决定,可直接使用[1].name或使用下拉菜单里的选项来查找按钮)
signal 按钮选项切换

func _ready() -> void:
	connect("mouse_entered",Callable(self,"鼠标进入"))
	connect("mouse_exited",Callable(self,"鼠标退出"))
	self.connect("size_changed",Callable(self,"大小改变"))
	set_z_index(1)
	set_mouse_filter(Control.MOUSE_FILTER_PASS)
	
	创建选项按钮()
	
func _process(delta: float) -> void:
	if sizee!=size:
		sizee=size
func 鼠标进入():
	鼠标在里面=true
func 鼠标退出():
	鼠标在里面=false
func 菜单切换(a):
	if a=="展开":
		if 图标显示==true and 图标动画==true:
			var tween:Tween=create_tween()
			tween.set_ease(动画对比("展开缓动"))
			if not 小图标aa.name in tween字典:
				tween字典[小图标aa.name]=tween
			else:
				if tween字典[小图标aa.name]!=null:
					tween字典[小图标aa.name].kill() 
					tween字典[小图标aa.name]=tween
			var aa=(0-TAU-小图标aa.rotation)/TAU
			tween.tween_property(小图标aa, "rotation",aa*TAU, 展开动画速度).as_relative().set_trans(动画对比("展开过渡"))
		var aa:int=0
		for i in 选项实例:
			var tween2:Tween=create_tween()
			tween2.set_ease(动画对比("展开缓动"))
			if not i.name in tween字典:
				tween字典[i.name]=tween2
			else:
				if tween字典[i.name]!=null:
					tween字典[i.name].kill() 
					tween字典[i.name]=tween2
			aa+=1
			tween2.tween_property(i, "position",Vector2(0,(self.position.y-i.position.y)+(self.position.y+sizee.y*aa)+选项间距*aa), 展开动画速度).as_relative().set_trans(动画对比("展开过渡"))
	if a=="收起":
		if 图标显示==true and 图标动画==true:
			var tween:Tween=create_tween()
			tween.set_ease(动画对比("收起缓动"))
			if not 小图标aa.name in tween字典:
				tween字典[小图标aa.name]=tween
			else:
				if tween字典[小图标aa.name]!=null:
					tween字典[小图标aa.name].kill() 
					tween字典[小图标aa.name]=tween
			var aa=(0-小图标aa.rotation)/TAU
			tween.tween_property(小图标aa, "rotation",aa*TAU, 收起动画速度).as_relative().set_trans(动画对比("收起过渡"))
		var aa:int=0
		for i in 选项实例:
			var tween2:Tween=create_tween()
			tween2.set_ease(动画对比("收起缓动"))
			if not i.name in tween字典:
				tween字典[i.name]=tween2
			else:
				if tween字典[i.name]!=null:
					tween字典[i.name].kill() 
					tween字典[i.name]=tween2
			aa+=1
			tween2.tween_property(i, "position",Vector2(0,self.position.y-i.position.y), 收起动画速度).as_relative().set_trans(动画对比("收起过渡"))
func _input(event: InputEvent) -> void:
	if event is InputEventMouseButton and event.pressed and event.button_index == MOUSE_BUTTON_LEFT:
		if 开关菜单==false:
			if event.position.y<=self.get_global_position().y+sizee.y and 鼠标在里面==true:
				开关菜单=true
		else:if 开关菜单==true:
			开关菜单=false
func 控件更新():
	显示文字.set_mouse_filter(MOUSE_FILTER_PASS)
	显示文字.set_text_alignment(HORIZONTAL_ALIGNMENT_CENTER)
	显示文字.set_anchors_and_offsets_preset(Control.PRESET_CENTER)
	显示文字.set_pivot_offset(Vector2(显示文字.size.x/2,显示文字.size.y/2))
	显示文字.size=sizee
	显示文字.position=Vector2(0,0)
	var aa:int=0
	for i in 选项实例:
		i.name=选项[aa]
		i.text=i.name
		i.size=sizee
		i.theme=样式预设
		aa+=1
	显示文字.text=选项实例[0].name
	显示文字.theme=样式预设
	小图标aa.texture=load(小图标文件路径)
	小图标aa.set_anchors_and_offsets_preset(Control.PRESET_CENTER_RIGHT)
	小图标aa.set_pivot_offset(Vector2(小图标aa.size.x/2,小图标aa.size.y/2))
	小图标aa.set_position(Vector2(小图标aa.position.x-sizee.x*(1-图标横轴位置),position.y+sizee.y*(1-图标竖轴位置)-小图标aa.size.y/2))
	显示文字.move_to_front()
	小图标aa.move_to_front()
func 创建选项按钮():
	for i in get_children():
		i.free()
	小图标aa=TextureRect.new()
	显示文字=Button.new()
	显示文字.name="显示文字"
	add_child(显示文字)
	add_child(小图标aa)
	选项实例.clear()
	var aa=0
	选项.reverse()
	for i in 选项:
		aa+=1
		var 按钮1=Button.new()
		add_child(按钮1)
		按钮1.add_to_group(String(self.name)+"buttons")
		按钮1.set_pivot_offset(Vector2(按钮1.size.x/2,按钮1.size.y/2))
		按钮1.set_z_index(0)
		按钮1.connect("button_down",Callable(self,"当前选项更改").bind(按钮1))
		按钮1.set_mouse_filter(Control.MOUSE_FILTER_PASS)
		选项实例.append(按钮1)
	选项.reverse()
	选项实例.reverse()
	控件更新()
func 当前选项更改(按钮):
	if get_global_mouse_position().y>self.get_global_position().y+sizee.y:
		print(按钮.name)
		显示文字.text=按钮.name
		var aa:Array=[self,按钮]
		emit_signal("按钮选项切换",aa)
func 动画对比(aa):
	match aa:
		"展开缓动":
			match 展开动画缓动:
				"快慢":
					return Tween.EASE_OUT
				"慢快":
					return Tween.EASE_IN
				"快慢快":
					return Tween.EASE_OUT_IN
				"慢快慢":
					return Tween.EASE_IN_OUT
		"展开过渡":
			match 展开动画过渡:
				"线性":return Tween.TRANS_LINEAR
				"正弦":return Tween.TRANS_SINE
				"5次方":return Tween.TRANS_QUINT
				"4次方":return Tween.TRANS_QUART
				"3次方":return Tween.TRANS_CUBIC
				"2次方":return Tween.TRANS_QUAD
				"平方根":return Tween.TRANS_CIRC
				"弹球":return Tween.TRANS_ELASTIC
				"弹跳":return Tween.TRANS_BOUNCE
				"回放":return Tween.TRANS_BACK
				"弹簧":return Tween.TRANS_SPRING
		"收起缓动":
			match 收起动画缓动:
				"快慢":
					return Tween.EASE_OUT
				"慢快":
					return Tween.EASE_IN
				"快慢快":
					return Tween.EASE_OUT_IN
				"慢快慢":
					return Tween.EASE_IN_OUT
		"收起过渡":
			match 收起动画过渡:
				"线性":return Tween.TRANS_LINEAR
				"正弦":return Tween.TRANS_SINE
				"5次方":return Tween.TRANS_QUINT
				"4次方":return Tween.TRANS_QUART
				"3次方":return Tween.TRANS_CUBIC
				"2次方":return Tween.TRANS_QUAD
				"平方根":return Tween.TRANS_CIRC
				"弹球":return Tween.TRANS_ELASTIC
				"弹跳":return Tween.TRANS_BOUNCE
				"回放":return Tween.TRANS_BACK
				"弹簧":return Tween.TRANS_SPRING
